libxl: Further fix exit paths from libxl_device_events_handler
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 10 Feb 2015 20:09:48 +0000 (20:09 +0000)
committerIan Campbell <ian.campbell@citrix.com>
Mon, 30 Mar 2015 08:35:00 +0000 (09:35 +0100)
On the success path, do not call GC_FREE explicitly.  Instead, call
AO_INPROGRESS.

GC_FREE will free the gc underlying the long-term ao, which is then
subsequently referenced in backend_watch_callback's call to
libxl__nested_ao_create.  It is a miracle that this ever works at all.

Also, add an `if (rc) goto out;' after the xswatch registration.

After this, libxl_device_events_handler has the conventional and
correct ao initiation pattern.

Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
CC: Roger Pau Monne <roger.pau@citrix.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
tools/libxl/libxl.c

index e9b4ed3191a24a2a62716aa386f1e87ec9e4f45a..2a735b3d5b2a44be61251ac68a0250bbd98a3921 100644 (file)
@@ -4592,11 +4592,12 @@ int libxl_device_events_handler(libxl_ctx *ctx,
     be_path = GCSPRINTF("/local/domain/%u/backend", domid);
     rc = libxl__ev_xswatch_register(gc, &ddomain.watch, backend_watch_callback,
                                     be_path);
+    if (rc) goto out;
 
-out:
-    GC_FREE;
-    if (rc) return AO_ABORT(rc);
     return AO_INPROGRESS;
+
+out:
+    return AO_ABORT(rc);
 }
 
 /******************************************************************************/